package ve.usb.cep.actions;
 
import com.opensymphony.xwork2.ActionContext;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import ve.usb.cep.db.Session;

import com.opensymphony.xwork2.ActionSupport;
import java.io.Serializable;

import ve.usb.cep.db.domainObjects.Usuario;
import ve.usb.cep.db.models.UsuarioModel;
import ve.usb.cep.db.modelExceptions.UsuarioException;
import ve.usb.cep.util.Hash;
 
public class RegistrarA extends ActionSupport {

    private int codigo;
    private String nombre = "";
    private String apellido = "";
    private String clave = "";
    private int cedula = 0;
    private Serializable rol = "";
    private String codigoTelefono = "";
    private String telefono = "";
    private String correo = "";
    private String pregunta = "";
    private String respuesta = "";
    private String attempt = "0";
    private String configurar = "0";
    private String cedulaAntes = "0";
    private String correoAntes = "0";


    @Override
    public String execute()
        throws java.sql.SQLException,
               java.security.NoSuchAlgorithmException,
               java.io.UnsupportedEncodingException
    {

        if (!attempt.equals("1")){
            return "input";
        }

        Usuario u = new Usuario();
        u.setNombre(this.nombre);
        u.setApellido(this.apellido);
        u.setClave(this.clave);
        u.setCedula(this.cedula);
        u.setRol("Estudiante");
        u.setTelefono(this.codigoTelefono + this.telefono);
        u.setCorreo(this.correo);
        u.setPregunta(this.pregunta);
        u.setRespuesta(this.respuesta);
        try{
            new UsuarioModel().set(u);
        }catch(UsuarioException e){
            e.printStackTrace();
        }

        return "success";
    }
    
    public String recordar() {
        return "success";
    }

    @Override
    public void validate() {

       if (!getAttempt().equals("1")){
           return;
       }

       if (getNombre().length() == 0) {
           addFieldError("nombre", "El nombre es obligatorio");
       }
       if (getApellido().length() == 0) {
           addFieldError("apellido", "El apellido es obligatorio");
       }
       if (getClave().length() == 0) {
           addFieldError("clave", "La contraseña es obligatoria");
       }
       if (getTelefono().length() == 0) {
           addFieldError("telefono", "El teléfono es obligatorio");
       }
       if (getCorreo().length() == 0) {
           addFieldError("correo", "El email es obligatorio");
       }
       if (getPregunta().length() == 0) {
           addFieldError("pregunta", "La pregunta es obligatoria");
       }
       if (getRespuesta().length() == 0) {
           addFieldError("respuesta", "La respuesta es obligatoria");
       }
       
       try {
           Connection conn = Session.connection();
           PreparedStatement pstmt;
           ResultSet rs;
               
           if (configurar.equals("1")) {
               if (getCedula() != Integer.parseInt(this.cedulaAntes)) {
                   pstmt = conn.prepareStatement("select * from usuario where cedula=?");
                   pstmt.setInt(1, getCedula());
                   rs = pstmt.executeQuery();
                   if (rs.next()) {
                       addFieldError("cedula", "Ya existe un usuario con esa cedula");
                   }
               }
               if (!getCorreo().equals(this.correoAntes)) {
                   pstmt = conn.prepareStatement("select * from usuario where correo=?");
                   pstmt.setString(1, getCorreo());
                   rs = pstmt.executeQuery();
                   if (rs.next()) {
                       addFieldError("correo", "Ya existe un usuario con ese correo");
                   }
               }
           } else {
               pstmt = conn.prepareStatement("select * from usuario where cedula=?");
               pstmt.setInt(1, getCedula());
               rs = pstmt.executeQuery();
               if (rs.next()) {
                   addFieldError("cedula", "Ya existe un usuario con esa cedula");
               }
               
               pstmt = conn.prepareStatement("select * from usuario where correo=?");
               pstmt.setString(1, getCorreo());
               rs = pstmt.executeQuery();
               if (rs.next()) {
                   addFieldError("correo", "Ya existe un usuario con ese correo");
               }
           }
       }catch(Exception e){
           e.printStackTrace();
       }
    }
    
    public String execute_configurar()
    {
        if (!attempt.equals("1")){
            return "input";
        }
        
        try {
            String correoAntes = user().getCorreo();
            Connection conn = Session.connection();
            PreparedStatement pstmt;
            ResultSet rs;

            pstmt = conn.prepareStatement("select * from usuario where correo=?");
            pstmt.setString(1, correoAntes);
            rs = pstmt.executeQuery();
            rs.next();

            Usuario u = new Usuario();
            u.setNombre(this.nombre);
            u.setApellido(this.apellido);
            u.setClave(this.clave);
            u.setCedula(this.cedula);
            u.setRol(rs.getString("rol"));
            u.setTelefono(this.codigoTelefono + this.telefono);
            u.setCorreo(this.correo);
            u.setCodigo(rs.getInt("codigo"));
            u.setPregunta(this.pregunta);
            u.setRespuesta(this.respuesta);
            
            ActionContext.getContext().getSession().put("user", u);

            new UsuarioModel().set(u);
        }catch(Exception e){
            e.printStackTrace();
        }

        return "success";
    }
    
    protected Usuario user(){

        Usuario u = (Usuario) ActionContext.getContext().getSession().get("user");
        if (null == u){
            u = new Usuario(0, "", "", "", 0, "Visitante", "", "", "", "");
        }
        return u;
    }

    public int getCodigo() {
        return this.codigo;
    }
    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    public String getNombre() {
        return this.nombre;
    }
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getApellido() {
        return this.apellido;
    }    
    public void setApellido(String apellido) {
        this.apellido = apellido;
    }

    public String getClave() {
        return this.clave;
    }    
    public void setClave(String clave) {
        this.clave = clave;
    }

    public int getCedula() {
        return this.cedula;
    }    
    public void setCedula(int cedula) {
        this.cedula = cedula;
    }

    public Serializable getRol() {
        return this.rol;
    }    
    public void setRol(Serializable rol) {
        this.rol = rol;
    }
    
    public String getCodigoTelefono() {
        return this.codigoTelefono;
    }    
    public void setCodigoTelefono(String codigoTelefono) {
        this.codigoTelefono = codigoTelefono;
    }

    public String getTelefono() {
        return this.telefono;
    }    
    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }

    public String getCorreo() {
        return this.correo;
    }
    public void setCorreo(String correo) {
        this.correo = correo;
    }
    
    public String getPregunta() {
        return this.pregunta;
    }
    public void setPregunta(String pregunta) {
        this.pregunta = pregunta;
    }
    
    public String getRespuesta() {
        return this.respuesta;
    }
    public void setRespuesta(String respuesta) {
        this.respuesta = respuesta;
    }

    public String getAttempt() {
        return this.attempt;
    }
    public void setAttempt(String correo) {
        this.attempt = correo;
    }
    
    public String getConfigurar() {
        return this.configurar;
    }
    public void setConfigurar(String configurar) {
        this.configurar = configurar;
    }
    
    public String getCedulaAntes() {
        return this.cedulaAntes;
    }
    public void setCedulaAntes(String cedulaAntes) {
        this.cedulaAntes = cedulaAntes;
    }
    
    public String getCorreoAntes() {
        return this.correoAntes;
    }
    public void setCorreoAntes(String correoAntes) {
        this.correoAntes = correoAntes;
    }
}
